{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# https://archive.ics.uci.edu/ml/machine-learning-databases/internet_ads/\n",
    "import os\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "data_folder = os.path.join(os.path.expanduser(\"~\"), \"data\", \"datasets\")\n",
    "data_filename = os.path.join(data_folder, \"Ads\", \"ad.data\")\n",
    "data_filename = \"Ads\", \"ad.data\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def convert_number(x):\n",
    "    try:\n",
    "        return float(x)\n",
    "    except ValueError:\n",
    "        return np.nan"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "converters = {}\n",
    "for i in range(1558):\n",
    "    converters[i] = convert_number"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "converters[1558] = lambda x: 1 if x.strip() == \"ad.\" else 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "ads = pd.read_csv(data_filename, header=None, converters=converters)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>...</th>\n",
       "      <th>1549</th>\n",
       "      <th>1550</th>\n",
       "      <th>1551</th>\n",
       "      <th>1552</th>\n",
       "      <th>1553</th>\n",
       "      <th>1554</th>\n",
       "      <th>1555</th>\n",
       "      <th>1556</th>\n",
       "      <th>1557</th>\n",
       "      <th>1558</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>125.0</td>\n",
       "      <td>125.0</td>\n",
       "      <td>1.0000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>57.0</td>\n",
       "      <td>468.0</td>\n",
       "      <td>8.2105</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>33.0</td>\n",
       "      <td>230.0</td>\n",
       "      <td>6.9696</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>60.0</td>\n",
       "      <td>468.0</td>\n",
       "      <td>7.8000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>60.0</td>\n",
       "      <td>468.0</td>\n",
       "      <td>7.8000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 1559 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    0      1       2     3     4     5     6     7     8     9     ...   1549  \\\n",
       "0  125.0  125.0  1.0000   1.0   0.0   0.0   0.0   0.0   0.0   0.0  ...    0.0   \n",
       "1   57.0  468.0  8.2105   1.0   0.0   0.0   0.0   0.0   0.0   0.0  ...    0.0   \n",
       "2   33.0  230.0  6.9696   1.0   0.0   0.0   0.0   0.0   0.0   0.0  ...    0.0   \n",
       "3   60.0  468.0  7.8000   1.0   0.0   0.0   0.0   0.0   0.0   0.0  ...    0.0   \n",
       "4   60.0  468.0  7.8000   1.0   0.0   0.0   0.0   0.0   0.0   0.0  ...    0.0   \n",
       "\n",
       "   1550  1551  1552  1553  1554  1555  1556  1557  1558  \n",
       "0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0     1  \n",
       "1   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0     1  \n",
       "2   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0     1  \n",
       "3   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0     1  \n",
       "4   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0     1  \n",
       "\n",
       "[5 rows x 1559 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ads.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "ads.dropna(inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X = ads.drop(1558, axis=1).values\n",
    "y = ads[1558]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.decomposition import PCA\n",
    "pca = PCA(n_components=5)\n",
    "Xd = pca.fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.854,  0.145,  0.001,  0.   ,  0.   ])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.set_printoptions(precision=3, suppress=True)\n",
    "pca.explained_variance_ratio_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "# from sklearn.cross_validation import cross_val_score\n",
    "from sklearn.model_selection import cross_val_score\n",
    "clf = DecisionTreeClassifier(random_state=14)\n",
    "scores_reduced = cross_val_score(clf, Xd, y, scoring='accuracy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.945,  0.934,  0.927])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "scores_reduced"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "classes = set(y)\n",
    "colors = ['red', 'green']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n6He/+50OHz6s6dOn6/7779d9992nr33ta1q5cqVGjRqlp556SpI0btw4lZaWavbs2crNzdXixYuZ\nwQkAPpJz+LAJRim2sgSGBOLHnHXUUpPsdretjSTp9dfN12nTTItZZ1t+unqmrHXsXkuLNHFibBHa\n/fvNOmZZWWZR14i2NtMit2uXdOml0scfx26LTD7wghcTlBzvXU5lpTdlg124l3jrrbd6ugi+Q524\no17cdUu9NDeHw+Xl4fDkyeZrKNT1z5khPi/xQjNnhsOmbcj8Ky9P/70tL4+/Rqq3T55svy0/337s\ndj3n7V3w663TnxXn60n2LxwOh4NB+7lg0LsX0dH70olrhGbO9K58fUim/7ewkwAA77C+W58Qtxdn\nQ0P6721HLTXJjp0zL122XdKuXfZWvp/9TPrKV2K3L1+euGzpsMyqvOzcc82MzHT3mXS+nmQqKqS8\nvFiLmyS1r4jgCS9aD73YuxUd8mwMGgCwvlvfcHrkSPuJ+nozoN+qocGMX8rKiv27//7Y7YnGee3e\nLY0eLf3+9+63S2bj8GDQjMuSzDgsp+Zm+1iqbdvsbVGRCQKZKikxYen4cQ3661/NPpOS6abMybGP\nH0ukulrKz0/t+WpqYhuhR4wf36miu3LuStCZbmLHe2vbAgueIaAB8E5PbFMEz+155BEzyD0SKlpb\nbbMtJZn39l/+xX7upz+NfZ9o26ZI4ImErgED4rd1uusu+30icnJMmebMiW9VqqmJBcV7703/RSea\nmOCcoHDggDlXWhpb+ywyfiyRQMCMm7PKzjYhtL7e1JFVQYH3W155yfHe7nHMioU36OIE4B0/bVOE\nTjs7fLhpXZkyxd41l58vjRljWq8SDVx3Dv7/zW/srTTOwDNgQHxX6W9/637t22+P3beiQnrnHff7\n/eu/Sk8/nfgFupXXuuSHdXeDvDz7YP7IrMpkC9Wm4tZbY7sVOLtAx4/399AAxwLG3bGGY39EQAPg\nHT9tU4T0vPmm6b47eVJXDBwo/ed/xgeHz37WdE1GFl51M2+e9Otfm+9ra83K+dZtkwIBe+AJBOJD\nnZv8fHvgt/4xkOr4LjfWsXVWkd0NZs2SDh2yz6psaDAtYM5QVl7ufi3JzN5MdJzBHzah4yFVvVJl\n20kg6TZb6DUIaAAAE85OnJAk5Zw6ZcJYJIRFgsPp04mDmSR99avS//2/9nORDccjtm41z2Xdysht\n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\nB0g5jj6k8OSuAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0bab484ba8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10,8))\n",
    "sns.set_style(\"whitegrid\")\n",
    "for cur_class, color in zip(classes, colors):\n",
    "    mask = (y == cur_class).values\n",
    "    plt.scatter(Xd[mask,0], Xd[mask,1], marker='o', color=color, label=int(cur_class))\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Custom Transformer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.base import TransformerMixin\n",
    "from sklearn.utils import as_float_array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class MeanDiscrete(TransformerMixin):\n",
    "    def fit(self, X, y=None):\n",
    "        X = as_float_array(X)\n",
    "        self.mean = X.mean(axis=0)\n",
    "        return self\n",
    "\n",
    "    def transform(self, X, y=None):\n",
    "        X = as_float_array(X)\n",
    "        assert X.shape[1] == self.mean.shape[0]\n",
    "        return X > self.mean"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "mean_discrete = MeanDiscrete()\n",
    "X_mean = mean_discrete.fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Mean Discrete performance: 0.917\n"
     ]
    }
   ],
   "source": [
    "from sklearn.pipeline import Pipeline\n",
    "pipeline = Pipeline([('mean_discrete', MeanDiscrete()), ('classifier', DecisionTreeClassifier(random_state=14))])\n",
    "scores_mean_discrete = cross_val_score(pipeline, X, y, scoring='accuracy')\n",
    "print(\"Mean Discrete performance: {0:.3f}\".format(scores_mean_discrete.mean()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}